今天要進入新的主題:樹(Tree)。這個結構人類一定很熟悉,基礎的目錄就是用樹的方式儲存的,生活中也有很多應用
樹的定義為:
這邊非常重要,接下來要討論有關於樹的任何主題,都會頻繁的使用到這些相關名詞
來看個範例:樹根為 A,總共有 3 個 subtree 的樹
父點在括號外,括號內用逗點區隔每個子樹。
如上述之樹可表示為:A(B(E, F), C(G), D(H, I, J))
先來定義節點結構:一個位置存資料,後面的欄位階保留給鏈結使用,作為樹的分支指向 child node。
例如,剛剛的樹可以表示成這樣:
看似相當的容易理解,但這有個大問題:
極度浪費 Linking Space
假設這棵樹的 degree 為 K,代表節點結構中必須要有 K 個 space 來儲存鏈結。又假設總共有 N 個節點,那麼整棵樹需要配置的鏈結空間為 NK 個。不過,實際用到的只有 N - 1 個,因為除了 root 之外,所有節點皆被一個鏈結連接。所以浪費了:NK - (N - 1) = N(K - 1) - 1 個空間。
比方說上面那棵樹,就浪費了:3 * 10 - (10 - 1) = 21 個空間。
看起來還好,計算一下比例:(N - 1) / N(K - 1) - 1,浪費趨近於 (K - 1) / K,如果這個 Tree 的 degree 是 10,那其浪費了 90% 的空間。太浪費了!
因次我們想將這個浪費的比例降到最低,Tree Degree 為 2 的話,可以將其精簡至浪費 1 / 2。
所以 明天我們就來討論一個新的結構:二元樹(Binary Tree)